import asyncio
import datetime

from aiogram import types

from database import models


def get_text_for_statistics(start_date: datetime.datetime,
                            end_date: datetime.datetime) -> str:
    """
    Получаем текст для вывода статистики по кверисету из главных продаж.

    :param start_date: Начало статистики.
    :param end_date: Конец статистики.
    :return: Текст статистики.
    """
    sales_main = models.SalesMain.get_sales_main_by_date(start_date, end_date)
    if sales_main.count() == 0:
        return (f'Не нашел данных за период с {start_date.strftime("%d.%m.%Y")} '
                f'по {end_date.strftime("%d.%m.%Y")}!')
    cash = sales_main.sum('sales__cash')
    sber = sales_main.sum('sales__sber')
    terminal = sales_main.sum('sales__terminal')
    discount = sales_main.sum('sales__discount')
    total_cost = sales_main.sum('sales__price')
    paid_sum = cash + sber + terminal
    rest_sum = total_cost - paid_sum - discount

    category_list = models.Sales.get_category_from_sales_main(sales_main)
    product_list = models.Sales.get_products_from_sales_main(sales_main)

    text = f'<b>Статистика с {start_date.strftime("%d.%m.%Y")} по {end_date.strftime("%d.%m.%Y")}</b>\n\n'
    if len(category_list) > 0:
        text += '<b>Топ категорий:</b>\n'
        for category, count, pay in category_list:
            category_total_sum = pay.cash + pay.sber + pay.terminal
            text += f'<i><b>{category.name}</b> * {count}шт = <b>{category_total_sum:,}</b>руб.</i>\n'

        text += '\n<b>Топ продуктов:</b>\n'
        for product, count, pay in product_list:
            product_total_sum = pay.cash + pay.sber + pay.terminal
            text += f"<i><b>{product.name}</b> * {count}шт = <b>{product_total_sum:,}</b>руб.</i>\n"

        text += f'\n' \
                f'<b>Общий чек: <i>{total_cost:,}</i></b>\n' \
                f'<b>Осталось оплатить: <i>{rest_sum:,}</i></b>\n' \
                f'<b>Наличка: <i>{cash:,}</i></b>\n' \
                f'<b>Перевод: <i>{sber:,}</i></b>\n' \
                f'<b>Терминал: <i>{terminal:,}</i></b>\n' \
                f'<b>Скидка: <i>{discount:,}</i></b>'
    else:
        text += 'Не нашел данных за этот период!'
    return text


async def not_correct_input(message: types.Message, error_text: str = 'Введите число.') -> None:
    await message.delete()
    msg = await message.answer(f'Ошибка...\n'
                               f'{error_text}')
    await asyncio.sleep(2)
    await msg.delete()
